package me.youline.dataServer.service.support.sms;

import java.util.concurrent.TimeUnit;

import javax.annotation.PostConstruct;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;

/**
 * 短信验证码与手机号关系缓存，主要用于根据手机号获取已发送的验证码
 * @author linhan
 *
 */
@Component
public class SmsCodeCacheService {

	private Cache<String,String> codeCache;
	
	@Value("#{frontProperties['cloopen.code.validMinute']}")
	private  int  validMinute;

	
	public SmsCodeCacheService(){
		
	}
	
	public SmsCodeCacheService(int codeValidMinute){
		buildCache(codeValidMinute);
	}
	
	@PostConstruct
	private void initialize(){
		buildCache(this.validMinute);
	} 
	
	protected void buildCache(int codeValidMinute){
		codeCache  = CacheBuilder.newBuilder().concurrencyLevel(1).expireAfterWrite(codeValidMinute, TimeUnit.MINUTES).maximumSize(10000).build();
	}

	public void addCode(String phoneNum, String code){
		codeCache.put(phoneNum, code);
	}
	
	/**
	 * 判断当前验证码是否为有效的验证码（此处存在多线程问题，即可能存在两个人拿着同样验证码验证同一个号码，二者都正确通过，而实际应该一个成功一个失败），
	 * 即缓存中是否存在需要校验的验证码，存在即需要马上清除返回true，若不存在继续保留
	 * 
	 * @param phoneNum
	 * @return
	 */
	public boolean  isValidCode(String phoneNum, String inputCode){
		String code = codeCache.getIfPresent(phoneNum);//当二者同时执行到这一步，就有可能存在同时验证成功的问题
		if(code == null){
			return false;
		}else if(code.equals(inputCode)){
			codeCache.invalidate(phoneNum);
			return true;
		}
		return false;
	}
}
